/**
 * @file calculator.cpp
 * @brief 一个简单的四则运算计算器程序
 */
#include<iostream>
#include<cstdio>
#include<string>
#include<stack>
#include<cctype>
using namespace std;
int prior[200]; /**< 运算符优先级数组 */
/**
 * @brief 判断字符是否为运算符
 * @param ch 要判断的字符
 * @return 如果是运算符返回true，否则返回false
 */
bool isoperator(char ch) {
	if(ch=='+') return 1;
	if(ch=='-') return 1;
	if(ch=='*') return 1;
	if(ch=='/') return 1;
	return 0;
}

/**
 * @brief 扫描和验证表达式的格式
 * @param exp 要扫描和验证的表达式
 * @return 如果表达式格式正确返回修改后的表达式，否则返回错误标志"E"
 */
string scan(string exp) {
	int explen=exp.length();
	int LBracket=0,RBracket=0;
	bool flag_point=0;
	string ans;
	if(exp[0]=='+'||exp[0]=='-'||exp[0]=='.') ans+='0';
	if(exp[0]=='*'||exp[0]=='/') return "E";
	if(exp[0]==')') return "E";
	if(exp[0]=='(') ++LBracket;
	ans+=exp[0];
	for(int i=1; i<explen; ++i) {
		if(isdigit(exp[i])) {
			if(ans[ans.length()-1]==')') return "E";
			ans+=exp[i];
			continue;
		}
		if(isoperator(exp[i])) {
			if(isoperator(ans[ans.length()-1])) return "E";
			if(ans[ans.length()-1]=='(') {
				if(exp[i]=='+'||exp[i]=='-') ans+='0';
				else return "E";
			}
			flag_point=0;
			ans+=exp[i];
			continue;
		}
		switch(exp[i]) {
			case '(': {
				if(ans[ans.length()-1]=='.') return "E";
				if(isdigit(ans[ans.length()-1])||ans[ans.length()-1]==')') return "E";
				ans+='(';
				++LBracket;
				break;
			}
			case ')': {
				if(ans[ans.length()-1]=='.') return "E";
				if(isoperator(ans[ans.length()-1])||ans[ans.length()-1]=='(') return "E";
				ans+=')';
				++RBracket;
				break;
			}
			case '.': {
				if(flag_point||ans[ans.length()-1]==')') return "E";
				flag_point=1;
				if(!isdigit(ans[ans.length()-1])) ans+=')';
				ans+=".";
				break;
			}
		}
		if(RBracket>LBracket) return "E";
	}
	if(RBracket!=LBracket) return "E";
	if(isoperator(ans[ans.length()-1])) return "E";
	if(ans[ans.length()-1]=='.') return "E";
	return ans;
}

/**
 * @brief 二元运算计算函数
 * @param num1 第一个操作数
 * @param opt 运算符
 * @param num2 第二个操作数
 * @return 计算结果
 */
double Binary_calc(double num1,char opt,double num2) {
	switch(opt) {
		case '+':
			return num1+num2;
		case '-':
			return num1-num2;
		case '*':
			return num1*num2;
		case '/':
			return num1/num2;
	}
	return 0;
}

/**
 * @brief 进行计算的函数
 * @param exp 要计算的表达式
 */
void calculate(string exp) {
	const int OPT=0;
	const int INT=1;
	const int FRAC=2;
	int state=OPT;//记录前一个输入的是运算符还是数字，是整数部分还是小数部分
	double currentNum=0;
	double currentFrac=0.1;
	int len=exp.length();
	stack<double> num;
	stack<char> op;
	for(int i=0; i<len; ++i) {
		if(exp[i]=='.') {
			state=FRAC;
			continue;
		}
		if(isdigit(exp[i])) {
			if(state==OPT) state=INT;
			if(state==INT) {
				currentNum=currentNum*10+exp[i]-'0';
			}
			if(state==FRAC) {
				currentNum+=currentFrac*(exp[i]-'0');
				currentFrac/=10;
			}
		} else if(state!=OPT) {
			num.push(currentNum);
			state=OPT;
			currentNum=0;
			currentFrac=0.1;
		}
		if(exp[i]=='(') {
			op.push('(');
		}
		if(exp[i]==')') {//计算右括号到对应左括号之间的内容，结果放入数字栈
			while(op.top()!='(') {
				stack<double> temp_num;
				stack<char> temp_op;
                //开一个临时数字栈和临时运算符栈，通过以下循环将运算优先级更高的元素移动到其中。
				do {
					temp_op.push(op.top());
					op.pop();
					temp_num.push(num.top());
					num.pop();
				} while(!op.empty()&&!temp_op.empty()&&prior[op.top()]==prior[temp_op.top()]);
				while(!temp_op.empty()) {//将临时栈中运算优先级更高的元素计算完毕，结果放回原先的数字栈栈顶。
					double num1=num.top();
					double num2=temp_num.top();
					char opt=temp_op.top();
					temp_num.pop();
					temp_op.pop();
					num.pop();
					num.push(Binary_calc(num1,opt,num2));
				}
			}
			op.pop();
		}
		if(isoperator(exp[i])) {
			stack<double> temp_num;
			stack<char> temp_op;
            //如果当前运算符优先级比前面的低，先完成前面优先级更高的运算，保证运算符栈中的运算符优先级递增
			while(!op.empty()&&prior[exp[i]]<prior[op.top()]) {
				temp_op.push(op.top());
				op.pop();
				temp_num.push(num.top());
				num.pop();
			}
			while(!temp_op.empty()) {
				double num1=num.top();
				double num2=temp_num.top();
				char opt=temp_op.top();
				temp_num.pop();
				temp_op.pop();
				num.pop();
				num.push(Binary_calc(num1,opt,num2));
			}
			op.push(exp[i]);
		}
	}
	if(exp[len-1]!=')') num.push(currentNum);//将最后一个数字放进栈中。
	while(!op.empty()) {
		stack<double> temp_num;
		stack<char> temp_op;
		do {
			temp_op.push(op.top());
			op.pop();
			temp_num.push(num.top());
			num.pop();
		} while(!op.empty()&&prior[op.top()]==prior[temp_op.top()]);
		while(!temp_op.empty()) {
			double num1=num.top();
			double num2=temp_num.top();
			char opt=temp_op.top();
			temp_num.pop();
			temp_op.pop();
			num.pop();
			num.push(Binary_calc(num1,opt,num2));
		}
	}
	cout<<num.top()<<endl;
	num.pop();
}

/**
 * @brief 对扫描后结果进行操作的函数
 * @param exp 扫描后的结果，可能是合法的表达式或错误标志"E"
 */
void operate(string exp) {
	if(exp[0]=='E') {
		puts("Error.");
		return;
	}
	calculate(exp);
}

/**
 * @brief 主函数
 * @return 程序执行结果
 */
int main() {
	prior['+']=1;
	prior['-']=1;
	prior['*']=2;
	prior['/']=2;
	string exp;
	getline(cin,exp);
	exp=scan(exp);
	operate(exp);
	return 0;
}